<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="container">
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </div>
</body>

<style>

    /* 
        从每行 N 项到每行 M 项(浏览器F12切换到手机窗口模式拉动缩放查看效果)
        clamp(
            clamp(
                100%/(N + 1) + 0.1%, 
                (W1 - 100vw)*1000,
                100%/(M + 1) + 0.1%
            ), 
            (W2 - 100vw)*1000, 
            100%
        )
        当屏幕宽度小于 时W2，我们限制到100%，或每行一个项目。
        当屏幕宽度大于 时W2，我们限制第一个clamp()。
        在第一个限制中，当屏幕宽度小于 时W1，我们夹到100%/(M + 1) + 0.1%)或每行 M 个项目。
        在第一个限制中，当屏幕宽度大于 时W1，我们夹到100%/(N + 1) + 0.1%)或每行 N 个项目。
        ✔️ 只有一行代码
        ✔️页脚中的元素宽度一致
        ✔️ 完全控制每行的项目数
        ✔️ 项目会变大变小
        ✔️ 控制项目何时换行
    */    
    .container {
        /* first breakpoint*/
        --w1: 800px;
        --n: 5;
        /* second breakpoint*/
        --w2: 400px;
        --m: 2;

        display: grid;
        grid-template-columns: repeat(
            auto-fill,
            minmax(
                clamp(
                    clamp(
                        100%/ (var(--n) + 1) + 0.1%,
                        (var(--w1) - 100vw) * 1000,
                        100%/ (var(--m) + 1) + 0.1%
                    ),                                      
                    (var(--w2) - 100vw) * 1000,
                    100%
                ),
                1fr
            )
        );
        gap: 10px;
    }       
    .container > div {
        height: 100px;
        background: red;
    }
</style>

</html>